﻿//================================================
//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//
//
//================================================
//
// Created by Huiyi on 2021/4/20.
//
//@模块名称 易炫彩算术库
//@依赖   module_base.h
//@版本   1.3
//@日期   2022-10-05
//@作者   Huiyi
//@模块备注 封装算术相关处理函数
//项目gitee地址 https://gitee.com/LoveA/XL_XExpand
//大部分代码已经历过粗略测试
//如发现BUG可提交issues
//https://gitee.com/LoveA/XL_XExpand/issues
//反馈QQ群:594165459

#pragma once

#ifndef XL_XEXPAND_MATH_H
//@隐藏{
#define XL_XEXPAND_MATH_H    //防止复用

#if XC_MOUDLE
#include "module_base.h"
#endif
//@隐藏}

//@src  "Math.cpp"

// TODO: 算术运算
//@分组{  算术运算


//@备注   将指定数值每一个比特位的值取反后返回
//@别名   运算_位取反(数值)
int X_Math_Bnot(int num);

//@别名   运算_左移(欲移动的整数,欲移动的位数)
int X_Math_Shl(int num,int Bit);

//@别名   运算_右移(欲移动的整数,欲移动的位数)
int X_Math_Shr(int num,int Bit);

//以下为cmath库封装,参见 https://learn.microsoft.com/zh-cn/cpp/standard-library/cmath?view=msvc-170

/*@声明

//@备注   计算 arg 的弧（反）正弦主值
//@别名   运算_取反余弦(弧度值)
float acos(...);
//@别名   运算_取反余弦f(弧度值)
float acosf(float x);
//@别名   运算_取反正弦(弧度值)
float asin(float x);
//@别名   运算_取反正弦f(弧度值)
float asinf(float x);
//@别名   运算_取反正切(弧度值)
float atan(float x);
//@别名   运算_取反正切f(弧度值)
float atanf(float x);
//@别名   运算_取反正切2(x,y)
float atan2(float y, float x);
//@别名   运算_取反正切2f(x,y)
float atan2f(float y, float x);
//@别名   运算_取余弦(弧度值)
float cos(float x);
//@别名   运算_取余弦f(弧度值)
float cosf(float x);
//@别名   运算_取正弦(弧度值)
float sin(float x);
//@别名   运算_取正弦f(弧度值)
float sinf(float x);
//@别名   运算_取正切(弧度值)
float tan(float x);
//@别名   运算_取正切f(弧度值)
float tanf(float x);
//@别名   运算_取反双曲余弦(待取值)
float acosh(float x);
//@别名   运算_取反双曲余弦f(待取值)
float acoshf(float x);
//@别名   运算_取反双曲正弦h(待取值)
float asinh(float x);
//@别名   运算_取反双曲正弦hf(待取值)
float asinhf(float x);
//@别名   运算_反正切h(待取值)
float atanh(float x);
//@别名   运算_反正切hf(待取值)
float atanhf(float x);
//@别名   运算_取双曲余弦h(待取值)
float cosh(float x);
//@别名   运算_取双曲余弦hf(待取值)
float coshf(float x);
//@别名   运算_取双曲正弦h(待取值)
float sinh(float x);
//@别名   运算_取双曲正弦hf(待取值)
float sinhf(float x);
//@别名   运算_取双曲正切h(待取值)
float tanh(float x);
//@别名   运算_取双曲正切hf(待取值)
float tanhf(float x);
//@别名   运算_取E的N次方(幂)
float exp(float x);
//@别名   运算_取E的N次方f(幂)
float expf(float x);
//@别名   运算_取2的N次方(x)
float exp2(float x);
//@别名   运算_取2的N次方f(x)
float exp2f(float x);
//@别名   运算_取绝对值(x)
int abs(...);
//@别名   运算_取绝对值f(x)
double fabs(...);
//@别名   运算_求次方(x,幂)
double pow(...);
//@别名   运算_求平方根(x)
float sqrt(...);
*/



//@隐藏{

#define X_Math_MakeLong(a, b) ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))

#define X_Math_MakeWord(a,b) ((WORD) (((BYTE) (a)) | ((WORD) ((BYTE) (b))) << 8))
//位与重载模板
template <typename T>
int X_Math_Dand(const T& t){return t;};
template <typename T, typename ... Args>
int X_Math_Dand(const T& head, const Args... args){return head & X_Math_Dand<int>(args...);};

//位或重载模板
template <typename T>
int X_Math_Bor(const T& t){return t;};
template <typename T, typename ... Args>
int X_Math_Bor(const T& head, const Args... args){return head | X_Math_Bor<int>(args...);};

//位异或重载模板
template <typename T>
int X_Math_Bxor(const T& t){return t;};
template <typename T, typename ... Args>
int X_Math_Bxor(const T& head, const Args... args){return head ^ X_Math_Bxor<int>(args...);};



//@隐藏}

/*@声明
//@别名 运算_位或()
int X_Math_Bor (...);

//@别名 运算_位异或()
int X_Math_Dxor (...);

//@别名 运算_位与()
int X_Math_Dand (...);

//@备注 将第一个整数的低16位放置到结果整数的低16位，将第二个整数的低16位放置到结果整数的高16位，以此合并成一个整数，并返回合并后的结果。
//@别名 运算_合并整数()
int X_Math_MakeLong(int num1,int num2);

//@备注 将第一个整数的低8位放置到结果短整数的低8位，将第二个整数的低8位放置到结果短整数的高8位，以此合并成一个短整数，并返回合并后的结果。
//@别名 运算_合并短整数()
int X_Math_MakeWord (int num1,int num2);

*/

//@分组}  算术运算


#endif //XL_XEXPAND_MATH_H
